package br.com.vilababy.sigvb.mb.aluno;

import java.io.Serializable;
import java.util.Arrays;
import java.util.List;
import java.util.Map;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ViewScoped;
import javax.faces.event.ActionEvent;

import org.primefaces.model.LazyDataModel;
import org.primefaces.model.SortOrder;

import br.com.vilababy.sigvb.SIGVBUtil;
import br.com.vilababy.sigvb.constantes.RelacaoEnum;
import br.com.vilababy.sigvb.constantes.SIGVBEnum;
import br.com.vilababy.sigvb.mb.AbstractAlunoMBean;
import br.com.vilababy.sigvb.modelo.Aluno;
import br.com.vilababy.sigvb.modelo.Autorizado;
import br.com.vilababy.sigvb.modelo.Contato;
import br.com.vilababy.sigvb.repository.AlunoRepository;
import br.com.vilababy.sigvb.repository.AutorizadoRepository;

@ManagedBean
@ViewScoped
public class AutorizadoMBean extends AbstractAlunoMBean implements Serializable {

	/**
	 * @author Diego Patrick da Silva Santos
	 */
	private static final long serialVersionUID = 1L;
	private Autorizado autorizado;
	private String totalPaginas;
	private LazyDataModel<Autorizado> autorizados;
	
	public AutorizadoMBean() {
		setRepositoryAluno(new AlunoRepository());
		setRepositoryAutorizado(new AutorizadoRepository());
		setComboAlunos(((AlunoRepository) getRepositoryAluno()).listarTodos());
		this.autorizado = new Autorizado();
		inicializarObjetosAutorizado();
	}
	
	public LazyDataModel<Autorizado> getAutorizados() {
		return autorizados;
	}

	public void setAutorizados(LazyDataModel<Autorizado> autorizados) {
		this.autorizados = autorizados;
	}

	public String getTotalPaginas() {
		return totalPaginas;
	}
	
	public void setTotalPaginas(String totalPaginas) {
		this.totalPaginas = totalPaginas;
	}
	
	public Autorizado getAutorizado() {
		return autorizado;
	}
	
	public void setAutorizado(Autorizado autorizado) {
		this.autorizado = autorizado;
	}
	
	@PostConstruct
	private void carregarAutorizadosPaginacao() {
		this.autorizados = new LazyDataModel<Autorizado>() {

			private static final long serialVersionUID = 1L;
			
			@Override
			public List<Autorizado> load(int primeiroRegistro, int totalRegistrosPagina,
					String campoOrdenacao, SortOrder ordenacao, Map<String, Object> filtros) {
				
				setRowCount(((AutorizadoRepository) getRepositoryAutorizado()).totalAutorizadosFiltrados());
				
				setPageSize(totalRegistrosPagina);
				
				return ((AutorizadoRepository) getRepositoryAutorizado()).listarParcial(primeiroRegistro, totalRegistrosPagina);
				
			}
		};
	}
	
	private void inicializarObjetosAutorizado() {
		Aluno aluno = new Aluno();
		this.autorizado.setAluno(aluno);
		Contato contato = new Contato();
		this.autorizado.setContato(contato);
	}
	
	public void adicionarAutorizado(ActionEvent evento) {
		if (!consultarExistenciaPaiMae()) {
			getRepositoryAutorizado().inserir(this.autorizado);
			SIGVBUtil.adicionarMensagemSucesso(SIGVBUtil.getValorMensagem(SIGVBEnum.LABEL_CADASTRO.getValor()), SIGVBUtil.getValorMensagem(SIGVBEnum.CADASTRO_RESPONSAVEL_SUCESSO.getValor()));
			carregarAutorizadosPaginacao();
			limparTela();
		}  
	}
	
	private boolean consultarExistenciaPaiMae() {
		if (this.autorizado.getRelacao().equals(RelacaoEnum.PAI)) {
			SIGVBUtil.adicionarMensagemErro(SIGVBUtil.getValorMensagem(SIGVBEnum.FALHA_CADASTRO.getValor()), SIGVBUtil.getValorMensagem(SIGVBEnum.PAI_EXISTENTE.getValor()));
			return ((AutorizadoRepository) getRepositoryAutorizado()).verificarExistenciaPai(this.autorizado.getAluno());
		} else if (this.autorizado.getRelacao().equals(RelacaoEnum.MAE)) {
			SIGVBUtil.adicionarMensagemErro(SIGVBUtil.getValorMensagem(SIGVBEnum.FALHA_CADASTRO.getValor()), SIGVBUtil.getValorMensagem(SIGVBEnum.MAE_EXISTENTE.getValor()));
			return ((AutorizadoRepository) getRepositoryAutorizado()).verificarExistenciaMae(this.autorizado.getAluno());
		}
	
		return false;
	}
	
	@Override
	protected void limparTela() {
		this.autorizado = new Autorizado();
		inicializarObjetosAutorizado();
	}
	
}
